---
title: 自定义导入行为
---

如果 Univer 默认的文档导入行为无法满足你的需求，你可以通过 Facade API 自定义导入行为。

大多数情况下，你可能会希望你可能会希望隐藏由插件提供的导入入口，或者将导入成功的文件直接展示在当前实例中，以下是一些可供参考的代码示例。

## 隐藏导入入口

<Tabs items={['Univer Sheets', 'Univer Docs']}>
  <Tab>
    **预设模式**

    ```typescript
    UniverSheetsCorePreset({
      menu: {
        'sheets-exchange-client.operation.exchange': {
          hidden: true,
        },
      },
    })
    ```

    ### 插件模式

    ```typescript
    univer.registerPlugin(UniverSheetsUIPlugin, {
      menu: {
        'sheets-exchange-client.operation.exchange': {
          hidden: true,
        },
      },
    })
    ```
  </Tab>
  <Tab>
    **预设模式**

    ```typescript
    UniverDocsCorePreset({
      menu: {
        'docs-exchange-client.operation.exchange': {
          hidden: true,
        },
      },
    })
    ```

    ### 插件模式

    ```typescript
    univer.registerPlugin(UniverDocsUIPlugin, {
      menu: {
        'docs-exchange-client.operation.exchange': {
          hidden: true,
        },
      },
    })
    ```
  </Tab>
</Tabs>

## 从 URL 导入文档

<Tabs items={['Univer Sheets', 'Univer Docs']}>
  <Tab>
    首先你需要获取一个 `File` 对象，通常你可以通过文件上传或从 URL 获取文件。以下是一个从 URL 获取 `.xlsx` 文件并转换为 `File` 对象的示例代码。

    ```typescript
    const url = 'https://example.com/filename.xlsx' // 你的 Excel 文件 URL

    // 从 URL 获取文件并转换为 File 对象的函数。
    // 这里使用 fetch API 直接获取文件，
    // 可能需要根据实际情况修改，
    // 比如文件地址的鉴权和跨域问题。
    async function fetchExcelFile(url) {
      try {
        const response = await fetch(url)
        const blob = await response.blob()
        return new File([blob], 'filename.xlsx', { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' })
      } catch (error) {
        console.error('Failed to fetch the file:', error)
      }
    }

    // 从 URL 获取文件并导入为快照
    // 如果 URL 文件地址没有鉴权，
    // 可以直接传入到 importXLSXToSnapshotAsync 或 importXLSXToUnitIdAsync 方法中
    const file = await fetchExcelFile(url)
    ```

    如果你使用了协同编辑功能，你可以使用 `univerAPI.importXLSXToUnitIdAsync` 方法来导入 `.xlsx` 文件获取 `unitId`，并通过 `univerAPI.loadServerUnit` 方法加载文档。

    ```typescript
    import { UniverInstanceType } from '@univerjs/core'
    // 预设模式下 `UniverInstanceType` 可从 @univerjs/presets 导入
    import { UniverInstanceType } from '@univerjs/presets'

    univerAPI.importXLSXToUnitIdAsync(file).then((unitId) => {
      console.log('Unit ID created:', unitId)

      univerAPI.loadServerUnit(unitId, UniverInstanceType.UNIVER_DOC)
    })
    ```

    如果你只是希望将 `.xlsx` 文件导入为快照（`IDocumentData`）并渲染到当前实例中，你可以使用 `univerAPI.importXLSXToSnapshotAsync` 方法。

    ```typescript
    // 以下代码需要根据实际情况修改
    univerAPI.importXLSXToSnapshotAsync(file).then((snapshot) => {
      console.log('Snapshot created:', snapshot)
      // 通过快照创建一个新的文档
      univerAPI.createWorkbook(snapshot)
    })
    ```
  </Tab>
  <Tab>
    首先你需要获取一个 `File` 对象，通常你可以通过文件上传或从 URL 获取文件。以下是一个从 URL 获取 `.docx` 文件并转换为 `File` 对象的示例代码。

    ```typescript
    const url = 'https://example.com/filename.docx' // 你的 Word 文件 URL

    // 从 URL 获取文件并转换为 File 对象的函数。
    // 这里使用 fetch API 直接获取文件，
    // 可能需要根据实际情况修改，
    // 比如文件地址的鉴权和跨域问题。
    async function fetchWordFile(url) {
      try {
        const response = await fetch(url)
        const blob = await response.blob()
        return new File([blob], 'filename.docx', { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' })
      } catch (error) {
        console.error('Failed to fetch the file:', error)
      }
    }

    // 从 URL 获取文件并导入为快照
    // 如果 URL 文件地址没有鉴权，
    // 可以直接传入到 importDOCXToSnapshotAsync 或 importDOCXToUnitIdAsync 方法中
    const file = await fetchWordFile(url)
    ```

    如果你使用了协同编辑功能，你可以使用 `univerAPI.importDOCXToUnitIdAsync` 方法来导入 `.docx` 文件获取 `unitId`，并通过 `univerAPI.loadServerUnit` 方法加载文档。

    ```typescript
    import { UniverInstanceType } from '@univerjs/core'
    // 预设模式下 `UniverInstanceType` 可从 @univerjs/presets 导入
    import { UniverInstanceType } from '@univerjs/presets'

    univerAPI.importDOCXToUnitIdAsync(file).then((unitId) => {
      console.log('Unit ID created:', unitId)

      univerAPI.loadServerUnit(unitId, UniverInstanceType.UNIVER_DOC)
    })
    ```

    如果你只是希望将 `.docx` 文件导入为快照（`IDocumentData`）并渲染到当前实例中，你可以使用 `univerAPI.importDOCXToSnapshotAsync` 方法。

    ```typescript
    // 以下代码需要根据实际情况修改
    univerAPI.importDOCXToSnapshotAsync(file).then((snapshot) => {
      console.log('Snapshot created:', snapshot)
      // 通过快照创建一个新的文档
      univerAPI.createUniverDoc(snapshot)
    })
    ```
  </Tab>
</Tabs>
